package org.csu.onlineedubackend.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.csu.onlineedubackend.entity.User;
import org.csu.onlineedubackend.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * 用户服务扩展实现类，提供用户设置相关功能
 */
@Service
public class UserServiceExtImpl {

    private static final Logger logger = LoggerFactory.getLogger(UserServiceExtImpl.class);

    @Autowired
    private UserMapper userMapper;
    
    /**
     * 根据ID查找用户
     * @param userId 用户ID
     * @return 用户对象
     */
    public User findUserById(Long userId) {
        return userMapper.selectById(userId);
    }
    
    /**
     * 检查用户密码是否正确
     * @param user 用户对象
     * @param password 待验证的密码
     * @return 密码是否正确
     */
//    public boolean checkPassword(User user, String password) {
//        if (user == null || password == null) {
//            logger.warn("检查密码失败：用户或密码为空");
//            return false;
//        }
//
//        // 尝试检查是否是明文密码存储（不安全，仅用于调试）
//        if (password.equals(user.getPassword())) {
//            logger.warn("警告：检测到可能的明文密码存储！");
//            return true;
//        }
//
//        String encryptedPassword = encryptPassword(password);
//        boolean matches = encryptedPassword.equals(user.getPassword());
//
//        // 如果不匹配，尝试检查常见密码
//        if (!matches) {
//            boolean isCommonPassword = checkCommonPasswords(user, password);
//            if (isCommonPassword) {
//                logger.warn("密码验证：使用常见密码匹配成功");
//                return true;
//            }
//        }
//
//        logger.info("密码验证结果：{}", matches ? "匹配" : "不匹配");
//        return matches;
//    }
    
    /**
     * 检查是否是常见密码（用于调试）
     */
    private boolean checkCommonPasswords(User user, String password) {
        // 尝试一些常见密码组合
        String[] commonPasswords = {
            "123456", "password", "admin", "test",
            user.getUsername(), user.getName()
        };
        
        for (String commonPwd : commonPasswords) {
            if (commonPwd != null && commonPwd.equals(password)) {
                logger.warn("检测到常见密码使用：{}", commonPwd);
                return true;
            }
        }
        
        return false;
    }

//    public void updatePassword(User user, String newPassword) {
//        if (user == null || newPassword == null) {
//            logger.warn("更新密码失败：用户或新密码为空");
//            return;
//        }
//
//        String encryptedPassword = encryptPassword(newPassword);
//        user.setPassword(encryptedPassword);
//        logger.info("密码已加密并更新，新加密密码：{}", encryptedPassword);
//    }
//
    public boolean checkPassword(User user, String password) {
        if (user == null || password == null) {
            logger.warn("检查密码失败：用户或密码为空");
            return false;
        }
        boolean matches = password.equals(user.getPassword());
        logger.info("密码验证结果：{}", matches ? "匹配" : "不匹配");
        return matches;
    }

    public void updatePassword(User user, String newPassword) {
        if (user == null || newPassword == null) {
            logger.warn("更新密码失败：用户或新密码为空");
            return;
        }
        user.setPassword(newPassword);
        logger.info("密码已明文更新，新密码：{}", newPassword);
    }
    /**
     * 保存用户信息
     * @param user 用户对象
     */
    public void saveUser(User user) {
        if (user == null) {
            logger.warn("保存用户失败：用户对象为空");
            return;
        }
        
        if (user.getId() != null) {
            logger.info("更新用户信息，ID：{}", user.getId());
            userMapper.updateById(user);
        } else {
            logger.info("插入新用户");
            userMapper.insert(user);
        }
    }
    
    /**
     * 加密密码
     * @param password 原始密码
     * @return 加密后的密码
     */
    public String encryptPassword(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(password.getBytes(StandardCharsets.UTF_8));
            String encoded = Base64.getEncoder().encodeToString(hash);
            logger.debug("密码加密：原始长度={}, 加密后长度={}", password.length(), encoded.length());
            return encoded;
        } catch (NoSuchAlgorithmException e) {
            logger.error("加密密码失败", e);
            throw new RuntimeException("加密密码失败", e);
        }
    }
} 